package org.skywork.dal.basic;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : SkyWork Data Access Layer
// Archivo : CodeudorDAO.java
// Descripcion : Clase CodeudorDAO
// *************************************************************************/
// Version : 2.11.8
// Fecha de Creación: 18 de Enero de 2015
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import org.skywork.dal.SkyWorkDAO;
import org.skywork.dal.system.ViewSkyWork;
import org.skywork.entitys.basic.Codeudor;
import org.skywork.entitys.basic.Empresa;
import org.skywork.entitys.basic.Persona;
import org.skywork.entitys.system.SkyWorkConstants;
import org.sql.commands.Filter;
import org.sql.commands.exception.DMLException;
import org.sql.commands.mysql.clause.Where;
import org.sql.commands.mysql.command.Insert;
import org.sql.commands.mysql.command.Select;
import org.sql.commands.mysql.filter.Condition;
import org.sql.commands.mysql.filter.Like;

public class CodeudorDAO extends SkyWorkDAO <Codeudor> {
    
    // Atributos estáticos de la clase CodeudorDAO
    
    private static final String COMMAND_POR_IDENTIFICACION = "COMANDO POR IDENTIFICACION";
    private static final String BUSCAR_POR_APELLIDOS = "BUSCAR POR APELLIDOS";
    private static final String BUSCAR_POR_NOMBRE_EMPRESA = "BUSCAR POR NOMBRE DE EMPRESA";
    
    // Atributos de la clase CodeudorDAO
    
    private final String NAME_TABLE = "CODEUDOR";
    private final int NUMBER_COLUMNS = 1;
    
    // Nombre de Columnas de la tabla Codeudor en Base de Datos
    
    public static final String ENTIDAD = "ENTIDAD";
    
    // Metodos de la clase CodeudorDAO
    
    /**
     * Este método nos permite ejecutar el registro de un Codeudor en la 
     * Base de Datos del Sistema. Donde el codeudor se establece con un objeto 
     * <code>Codeudor</code>.
     * 
     * @param  codeudor Objeto que contiene los datos del Codeudor
     * @return Retorna el resultado del proceso en un dato <code>boolean</code>.
     * @throws SQLException Se lanzara esta excepción cuando ocurra errores SQL.
     * @throws DMLException Se lanzara esta excepción cuando ocurra errores DML.
     */
    public static boolean registrar(Codeudor codeudor) throws SQLException, DMLException {
        return new CodeudorDAO().insert(codeudor);
    }
    
    /**
     * Este método nos permite realizar la busqueda de un Codeudor por medio
     * de su Número de Identificación en la Base de Datos del Sistema. Donde el número
     * de identificación se establece con un objeto <code>String</code>.
     * 
     * @param identificacion Número de Identifiacación del Codeudor
     * @return Retorna el codeudor en un objeto <code>Codeudor</code>.
     * @throws SQLException Se lanzara esta excepción cuando ocurra errores SQL.
     * @throws DMLException Se lanzara esta excepción cuando ocurra errores DML.
     */
    public static Codeudor buscarPorIdentificacion(String identificacion) throws SQLException, DMLException {
        TIPO_COMANDO = COMMAND_POR_IDENTIFICACION; // Tipo de Comando
        return new CodeudorDAO().selectUnique(identificacion);
    }
    
    /**
     * Este método nos permite realizar la busqueda de Codeudores por 
     * medio de sus Apellidos en la Base de Datos del Sistema. Donde el sus 
     * apellidos se establece con un objeto <code>String</code>.
     * 
     * @param apellido Parámetro apellido para realizar busqueda de Codeudores
     * @return Retorna los codeudores en un objeto <code>ArrayList</code>.
     * @throws SQLException Se lanzara esta excepción cuando ocurra errores SQL.
     * @throws DMLException Se lanzara esta excepción cuando ocurra errores DML.
     */
    public static ArrayList <Codeudor> buscarPorApellidos(String apellido) throws SQLException, DMLException {
        TIPO_COMANDO = BUSCAR_POR_APELLIDOS;  // Tipo de Comando
        return new CodeudorDAO().select(apellido,apellido);
    }
    
    /**
     * Este método nos permite realizar la busqueda de Codeudores por medio
     * del Nombre de empresa en la Base de Datos del Sistema. Donde el nombre de
     * empresa se establece con un objeto <code>String</code>.
     * 
     * @param nombre Parámetro nombre para realizar busqueda de Codeudores
     * @return Retorna los codeudores en un objeto <code>ArrayList</code>.
     * @throws SQLException Se lanzara esta excepción cuando ocurra errores SQL.
     * @throws DMLException Se lanzara esta excepción cuando ocurra errores DML.
     */
    public static ArrayList <Codeudor> buscarPorNombreDeEmpresa(String nombre) throws SQLException, DMLException {
        TIPO_COMANDO = BUSCAR_POR_NOMBRE_EMPRESA;  // Tipo de Comando
        return new CodeudorDAO().select(nombre);
    }
    
    // Metodos sobreescritos de la clase ArrendatarioDAO

    @Override
    protected ArrayList generateDataInsert(Codeudor object) {
        // Instanciando Array para contener los datos 
        ArrayList entidadDatos = new ArrayList();
        
        // Cargando datos a insertar en el Array
        entidadDatos.add(object.getEntidad().getIdentificacion());
        
        return entidadDatos; // Datos para Insertar
    }

    @Override
    protected Insert generateInsert() {
        return Insert.creatorCommand(NAME_TABLE,NUMBER_COLUMNS);
    }

    @Override
    protected Select generateSelect() {
        Select select = new Select(); // Creando sentencia de Busqueda
        
        switch (TIPO_COMANDO) {
            // Busqueda de Arrendatario por Identificación en el Sistema
            case (COMMAND_POR_IDENTIFICACION) :
                // Implementando Vista 0001 de la Base de Datos
                select.addColumn("*"); select.addTable(ViewSkyWork.CODEUDOR_POR_IDENTIFICACION); 
                
                WHERE = new Where(); // Clausula del Comando
                WHERE.addFilter(Condition.creatorFilter(ENTIDAD + " = ?"));
                select.addClause(WHERE); // Agregando clausula al Comando
            break;
                
            // Busqueda de Arrendatario por Apellidos en el Sistema (Solo para Personas)
            case (BUSCAR_POR_APELLIDOS) :
                // Implementando Vista 0002 de la Base de Datos
                select.addColumn(EntidadDAO.TIPO_ENTIDAD);  select.addColumn(ENTIDAD); 
                select.addTable(ViewSkyWork.CODEUDOR_POR_APELLIDOS); 
                
                WHERE = new Where(); // Clausula del Comando
                WHERE.addFilter(Like.creatorFilter(PersonaDAO.PRIMER_APELLIDO));
                WHERE.addFilter(Like.creatorFilter(PersonaDAO.SEGUNDO_APELLIDO,Filter.OR));
                select.addClause(WHERE); // Agregando clausula al Comando
            break;
                
            // Busqueda de Arrendatario por Apellidos en el Sistema (Solo para Personas)
            case (BUSCAR_POR_NOMBRE_EMPRESA) :
                // Implementando Vista 0003 de la Base de Datos
                select.addColumn(EntidadDAO.TIPO_ENTIDAD);  select.addColumn(ENTIDAD); 
                select.addTable(ViewSkyWork.CODEUDOR_POR_NOMBRE_EMPRESA); 
                
                WHERE = new Where(); // Clausula del Comando
                WHERE.addFilter(Like.creatorFilter(EmpresaDAO.NOMBRE));
                select.addClause(WHERE); // Agregando clausula al Comando
            break;
        } // Definiendo el tipo de Sentencia para realizar Busqueda
        
        return select; // Retornando Commando de Selección
    }

    @Override
    protected Codeudor generateObject(ResultSet result) throws SQLException {
        String tipoEntidad = result.getString(EntidadDAO.TIPO_ENTIDAD);
        Codeudor codeudor = null; // Arrendatario a retornar
        
        switch (tipoEntidad) {
            // El arrendatario es una Persona
            case (SkyWorkConstants.PERSONA) :
                codeudor = new Codeudor(new Persona(result.getString(ENTIDAD)));
            break;
                
            // El arrendatario es una Empresa
            case (SkyWorkConstants.EMPRESA) :
                codeudor = new Codeudor(new Empresa(result.getString(ENTIDAD)));
            break;
        } // Determinando el tipo de Entidad
        
        return codeudor; // Retornando arrendatario del Sistema
    }
}